package br.edu.ufcg.p1.barzin.dialog;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

import android.app.AlertDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;
import br.edu.ufcg.p1.barzin.App;
import br.edu.ufcg.p1.barzin.R;
import br.edu.ufcg.p1.barzin.async.RealizaPedidoTask;
import br.edu.ufcg.p1.barzin.gui.PessoaCheckBox;
import br.edu.ufcg.p1.barzin.model.Item;
import br.edu.ufcg.p1.barzin.model.Pedido;
import br.edu.ufcg.p1.barzin.model.Pessoa;


public class RealizaPedidosDialogFragment extends DialogFragment {

	private View view;
	private Item item;

	public RealizaPedidosDialogFragment(View v, Item i) {
		this.view = v;
		this.item = i;
	}
	
	@Override
	public Dialog onCreateDialog(Bundle savedInstanceState) {
		this.setUpGUI();
		return new AlertDialog.Builder(getActivity())
		.setIcon(android.R.drawable.ic_dialog_alert)
		.setView(view).create();
	}

	private void modificaCheckBoxes(TableLayout grid, boolean novoEstado) {
		for (int j = 0; j < grid.getChildCount(); j++) {
			TableRow tr = (TableRow) grid.getChildAt(j);
			for (int k = 0; k < tr.getChildCount(); k++) {
				CheckBox cb = (CheckBox) tr.getChildAt(k);
				cb.setChecked(novoEstado);
			}
		}
	}

	private void calculaEAtualizaValorParcela(int qntPessoas) {
		if (qntPessoas > 0) { 
			double total = Double.parseDouble(((TextView) view.findViewById(R.id.pedidoTotal)).getText().toString().replace(",", "."));
			double parcela = Double.parseDouble(((TextView) view.findViewById(R.id.pedidoParcela)).getText().toString().replace(",", "."));
			parcela = total / qntPessoas;
			parcela = Math.round(parcela * 100.0) / 100.0;
			
			DecimalFormat df = new DecimalFormat("0.00");
			String valor = df.format(parcela).replace(".", ",");
			
			((TextView) view.findViewById(R.id.pedidoParcela)).setText(valor);
		}
	}

	private List<Pessoa> getPessoasChecked(TableLayout grid) {
		List<Pessoa> pessoas = new ArrayList<Pessoa>();

		for (int j = 0; j < grid.getChildCount(); j++) {
			TableRow tr = (TableRow) grid.getChildAt(j);
			for (int k = 0; k < tr.getChildCount(); k++) {
				PessoaCheckBox cb = (PessoaCheckBox) tr.getChildAt(k);
				if (cb.isChecked()) {
					pessoas.add(cb.getPessoa());
				}
			}
		}

		return pessoas;
	}
	
	private void setUpBotoesFinais() {
		((Button) this.view.findViewById(R.id.pedidoBotaoCancelar)).setOnClickListener(new OnClickListener() {
//			@Override
			public void onClick(View v) {
				dismiss();
			}
		});

		((Button) this.view.findViewById(R.id.pedidoBotaoRealizar)).setOnClickListener(new OnClickListener() {
//			@Override
			public void onClick(View v) {
				int qnt = Integer.parseInt(((TextView) view.findViewById(R.id.pedidoQnt)).getText().toString());
				if (qnt == 0) {
					Toast.makeText(getActivity(), "Necessario pedir pelo menos um", Toast.LENGTH_LONG).show();
					return;
				}

				TableLayout grid = (TableLayout) view.findViewById(R.id.pedidosTableLayout);
				List<Pessoa> pessoas = getPessoasChecked(grid);
				if (pessoas.isEmpty()) {
					Toast.makeText(getActivity(), "Necessario marcar pelo menos uma pessoa", Toast.LENGTH_LONG).show();
				} else {

					Pedido novoPedido = new Pedido(null, item, qnt, pessoas, "Pendente", "");
					
					new RealizaPedidoTask().execute(novoPedido);
					
					Toast.makeText(getActivity(), "Pedido Realizado", Toast.LENGTH_LONG).show();
					dismiss();
				}
			}
		});
	}
	
	private void populaTableLayout() {
		TableLayout grid = (TableLayout) this.view
				.findViewById(R.id.pedidosTableLayout);
		
//		grid.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
//				LayoutParams.WRAP_CONTENT));
		
		List<Pessoa> pessoas = App.environment().getDao().recuperaPessoas();

		TableRow tr = new TableRow(getActivity());
		tr.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
				LayoutParams.WRAP_CONTENT));

		int i = 0;
		for (Pessoa pessoa : pessoas) {
			PessoaCheckBox cb = new PessoaCheckBox(getActivity(), pessoa);
			
			cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
//				@Override
				public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
					TableLayout grid = (TableLayout) view.findViewById(R.id.pedidosTableLayout);
					List<Pessoa> totalPessoas = getPessoasChecked(grid);

					if (!totalPessoas.isEmpty()) {
						calculaEAtualizaValorParcela(totalPessoas.size());
					} else {
						((TextView) view.findViewById(R.id.pedidoParcela)).setText("0.0");
					}
				}
			});

			tr.addView(cb);

			i++;
			if (i == 5) {
				i = 0;
				grid.addView(tr);
				tr = new TableRow(getActivity());

			}
		}
		if (i != 0) {
			grid.addView(tr);
		}
	}
	
	private void atualizaQuantidade(int qnt) {
		((TextView) this.view.findViewById(R.id.pedidoQnt)).setText(qnt+"");

		double total = Double.parseDouble(((TextView) this.view.findViewById(R.id.pedidoTotal)).getText().toString().replace(",", "."));
		total = qnt * item.getPreco();
		total = Math.round(total * 100.0) / 100.0;

		DecimalFormat df = new DecimalFormat("0.00");
		String valor = df.format(total).replace(".", ",");
		
		((TextView) this.view.findViewById(R.id.pedidoTotal)).setText(valor);

		TableLayout grid = (TableLayout) this.view.findViewById(R.id.pedidosTableLayout);
		List<Pessoa> totalPessoas = getPessoasChecked(grid);

		if (!totalPessoas.isEmpty()) {
			calculaEAtualizaValorParcela(totalPessoas.size());
		} else {
			((TextView) this.view.findViewById(R.id.pedidoParcela)).setText("0,00");
		}
	}
	
	private void setUpGUI() {
		((TextView) this.view.findViewById(R.id.pedidoItemNome)).setText(item
				.getNome());
		((TextView) this.view.findViewById(R.id.pedidoItemNome)).setTextSize(38);
		((TextView) this.view.findViewById(R.id.pedidoItemDescricao)).setText(item
				.getDescricao());
		((TextView) this.view.findViewById(R.id.pedidoItemPreco)).setText("R$ "
				+ item.getPrecoFormatado() + "");
		((TextView) this.view.findViewById(R.id.pedidoItemPreco)).setTextSize(38);
		((TextView) this.view.findViewById(R.id.textViewPedir)).setTextSize(28);
		((TextView) this.view.findViewById(R.id.pedidoQnt)).setTextSize(28);
		
		populaTableLayout();
		setUpBotoesFinais();
		
		((Button) this.view.findViewById(R.id.pedidoBotaoMarcarTodos)).setOnClickListener(new OnClickListener() {
//			@Override
			public void onClick(View v) {
				TableLayout grid = (TableLayout) view.findViewById(R.id.pedidosTableLayout);
				modificaCheckBoxes(grid, true);
				calculaEAtualizaValorParcela(getPessoasChecked(grid).size());
			}

		});

		((Button) this.view.findViewById(R.id.pedidoBotaoDesmarcar)).setOnClickListener(new OnClickListener() {
//			@Override
			public void onClick(View v) {
				TableLayout grid = (TableLayout) view.findViewById(R.id.pedidosTableLayout);
				modificaCheckBoxes(grid, false);
				((TextView) view.findViewById(R.id.pedidoParcela)).setText("0.0");
			}
		});

		((ImageView) this.view.findViewById(R.id.pedidoAddQnt)).setOnClickListener(new OnClickListener() {
//			@Override
			public void onClick(View v) {
				int qnt = Integer.parseInt(((TextView) view.findViewById(R.id.pedidoQnt)).getText().toString());
				qnt++;
				atualizaQuantidade(qnt);
			}

		});

		((ImageView) this.view.findViewById(R.id.pedidoFotoImg)).setImageBitmap(item.getFoto());
		
		((ImageView) this.view.findViewById(R.id.pedidoDelQnt)).setOnClickListener(new OnClickListener() {
//			@Override
			public void onClick(View v) {
				int qnt = Integer.parseInt(((TextView) view.findViewById(R.id.pedidoQnt)).getText().toString());
				if (qnt != 0) {
					qnt--;
					atualizaQuantidade(qnt);
				}
			}
		});
	}
	
}